[DMS] MongoDBのデータをDynamoDBにレプリケーションする
こんにちは、菊池です。
DMSでは、レプリケーションソースにMongoDBをサポートしています。これまでに、MongoDBからMySQL、S3へのレプリケーションを紹介しました。
- Database Migration Service の Source に MongoDB が選択可能になりました!
- [DMS] MongoDB Sourceのマイグレーションモードを比較する
- [DMS] MongoDB:テーブルモードのデータパターン検証
- [DMS] MongoDBからRDS MySQLへのレプリケーションを試す
今回は、同じNOSQL DBである、DynamoDBへのレプリケーションを試してみました。
検証
SourceとしてEC2で動作するMongoDBのレプリカセット、TargetとしてDynamoDBを利用します。
- Source
- MongoDB 3.4.6
- レプリケーションモード:テーブルモード
- Target
- DynamoDB
レプリケーション対象コレクション
ソースとなるMongoDBには以下のようcontacts
コレクションにドキュメントを格納しておきます。
s0:PRIMARY> db.contacts.find() { "_id" : ObjectId("5977d2ce23ebab08bb17ed6a"), "name" : "hoge1", "city" : "Tokyo", "phone" : "090-xxxx-xxxx" } { "_id" : ObjectId("5977d2d523ebab08bb17ed6b"), "name" : "hoge2", "city" : "Kanagawa", "email" : "hoge2@example1.com" } { "_id" : ObjectId("5977d2dc23ebab08bb17ed6c"), "name" : "hoge3", "city" : "Chiba" }
DynamoDBターゲットの作成
エンドポイントとして、DynamoDBのターゲットを追加します。
DynamoDBを選択すれば、必要なのはエンドポイント名とIAMロールの指定だけです。IAMロールはあらかじめ作成しておきましょう。IAMロールにはDMSが権限を引き受けられるよう、ロールポリシーを設定します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "dms.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
タスクの作成と実行
続いてタスクの作成と実行です。なお、MongoDBソースのエンドポイント作成については割愛しますので、必要に応じて過去のエントリを参照ください。
ソース/ターゲットのエンドポイントを指定し、テーブルマッピングを設定します。今回は特にマッピングの指定はしませんが、対象のテーブル(MongoDBではコレクション)を指定します。ちょっと日本語が微妙ですが、テーブル名を入れてルールを追加します。
追加されました。
テーブルマッピングは、JSONで指定することも可能です。
今回の場合は以下のようになります。
{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "%", "table-name": "contacts" }, "rule-action": "include" } ] }
タスクが作成されましたので、そのまま実行し完了を待ちます。
ロードが完了しました。
出力テーブルの確認
それでは出力を確認します。
DynamoDBのコンソールを確認すると、テーブルが作成されています。
キャパシティは、Read/Writeとも200が設定されています。パーテーションキーは、old__id
と設定されています。
テーブルの中のデータをみてみます。
元のMongoDBのドキュメントがしっかりとレプリケーションされています。パーテーションキーのold__id
の中は、元のコレクションの_id
の値と一致しています。
まとめ
以上です。
これまでにRDBであるMySQL、ファイルストレージのS3、そして今回、NOSQLのDynamoDBへのレプリケーションを試してきました。MongoDBのようなNOSQL DBは、特定の用途に特化した一方で苦手なユースケースも多いです。DMSを使ってデータを連携することで、適切なデータストアを選択・利用することができます。